#include "e2prom_func.h"

int e2prom_func_init(void)
{

    i2c_device_hardware_init();
    if (1 == i2c_coummunication_driver_init(0xA2,
                                            i2c_scl_high,
                                            i2c_scl_low,
                                            i2c_sda_output_to_input,
                                            i2c_sda_intput_to_output,
                                            i2c_sda_high,
                                            i2c_sda_low,
                                            i2c_read_sda))
    {
        return 0;
    }
    return -1;
}
int e2prom_read(uint16_t address, uint8_t *data, uint16_t lenth)
{
    if (1 == i2c_read_bytes(data, 0xA0,  address,8, lenth))
    {
        return 0;
    }
    return -1;
}

int e2prom_write(uint16_t address, uint8_t *data, uint16_t lenth)
{
	return -1;
}

/* 引脚定义 */
#define SCL_PORT GPIOA
#define SCL_PIN GPIO_Pin_8
#define SDA_PORT GPIOC
#define SDA_PIN GPIO_Pin_9

/* 操作原子化 */
#define SCL_H() GPIO_SetBits(SCL_PORT, SCL_PIN)
#define SCL_L() GPIO_ResetBits(SCL_PORT, SCL_PIN)
#define SDA_H() GPIO_SetBits(SDA_PORT, SDA_PIN)
#define SDA_L() GPIO_ResetBits(SDA_PORT, SDA_PIN)
#define SDA_READ() GPIO_ReadInputDataBit(SDA_PORT, SDA_PIN)
void i2c_device_hardware_init(void)
{

    GPIO_InitTypeDef gpio;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);

    /* SCL PA8 开漏 */
    gpio.GPIO_Pin = SCL_PIN;
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    gpio.GPIO_OType = GPIO_OType_OD;
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio);
    GPIO_SetBits(GPIOA, SCL_PIN); /* 空闲高 */

    /* SDA PC9 开漏 */
    gpio.GPIO_Pin = SDA_PIN;
    GPIO_Init(GPIOC, &gpio);
    GPIO_SetBits(GPIOC, SDA_PIN);
}

// Pin_IO_Handle I2C_SCL_HIGH;
uint8_t i2c_scl_high(void)
{
    //    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    SCL_H();
    return 1;
}

// Pin_IO_Handle I2C_SCL_LOW;
uint8_t i2c_scl_low(void)
{
    // GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    SCL_L();
    return 1;
}

uint8_t i2c_sda_output_to_input(void)
{
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Pin = SDA_PIN;
    gpio.GPIO_Mode = GPIO_Mode_IN;
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOC, &gpio);
    return 1;
}
uint8_t i2c_sda_intput_to_output(void)
{
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Pin = SDA_PIN;
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    gpio.GPIO_OType = GPIO_OType_OD; // 开漏
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio);
    return 1;
}

uint8_t i2c_sda_high(void)
{
    SDA_H();
    return 1;
}
uint8_t i2c_sda_low(void)
{
    SDA_L();
    return 1;
}

uint8_t i2c_read_sda(void)
{
    return SDA_READ();
    // return  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
    // return 1;
}
